﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code;
using Web.Framework.Controls;
using WebAppPlanProduccion.Code.Security;
using Web.Framework;
using PlanProd.Contracts.enums;
using System.Collections.Specialized;

namespace WebAppPlanProduccion.App
{
    public partial class PlanProduccionEditDesvios : BasePage
    {
        private PlanProduccion PlanProduccion { get; set; }

        private int PlanProduccionId
        {
            get
            {
                return Convert.ToInt32(ViewState["PlanProduccionId"]);
            }
            set
            {
                ViewState["PlanProduccionId"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            HasPermissionToSeeMe(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);

            if (!this.IsPostBack)
            {
                if (this.Request.QueryString["Id"] != null)
                {
                    PlanProduccionId = Convert.ToInt32(this.Request.QueryString["Id"]);
                    PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId);

                    string seleccioneUnValor = "Seleccione un valor";
                    UIHelper.LoadTipoDesvio(this.cboTipoDesvio, seleccioneUnValor);
                    UIHelper.LoadCausaDeDesvio(this.cboDesvioCausa, seleccioneUnValor);

                    Bind();
                }
            }
        }

        protected override void ApplySecurity()
        {
            //this.lnkVerPresupuestoProduccion.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_VER);
            //this.lnkCargarDesvioMasivo.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_CREAR);
            //this.lnkVerPendientes.Visible = HasPermissionFor(PlanProdSecurity.PLANPRODUCCION_DESVIO_VER);
        }

        private void Bind()
        {
            lnkVerPresupuestoProduccion.NavigateUrl = string.Format("/App/PresupuestoProduccionEdit.aspx?Id={0}", PlanProduccion.PresupuestoProduccionId);

            this.txtPlanProduccionId.Text = PlanProduccion.Id.ToString();
            this.txtTemporada.Text = PlanProduccion.TemporadaNombre;
            this.txtDestino.Text = PlanProduccion.DestinoNombre;
            this.txtProveedor.Text = PlanProduccion.ProveedorNombre;
            this.txtTotalPlan.Text = PlanProduccion.TotalPlan.ToString();

            BindAuditory(PlanProduccion);

            Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);
            HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaAnio();            

            List<CantidadesProducto> productos = new List<CantidadesProducto>();
            foreach (var detalleProducto in PlanProduccion.DetalleDeProductos)
            {
                CantidadesProducto producto = new CantidadesProducto();
                producto.Id = detalleProducto.Id;
                producto.ProductoId = detalleProducto.ProductoId;
                producto.ProductoIdExterno = detalleProducto.ProductoIdExterno;
                producto.ProductoNombre = detalleProducto.ProductoNombre;
                producto.ColorId = detalleProducto.ColorIdExterno;
                producto.Color = detalleProducto.ColorNombreExterno;
                producto.CalidadId = detalleProducto.CalidadId;
                producto.Calidad = detalleProducto.Calidad;
                //producto.JsCommand = string.Format("javascript:location.href='/App/DesvioIndividual.aspx?planProdId={0}&detalleProdId={1}';", PlanProduccion.Id, detalleProducto.Id);
                producto.JsCommand = "javascript:window.planProdCtrl.AddDesvioEditRow(%FILA%);";
                producto.JsCommandImgUrl = detalleProducto.DesvioPendienteDeAprobacion ? "/Images/aprobar.png" : "/Images/editar.png";
              
                producto.Semanas = new List<SemanaCantidadProducto>();
                foreach (var cantidadSemana in detalleProducto.CantidadesPorSemana)
                {
                    SemanaCantidadProducto semana = new SemanaCantidadProducto();
                    semana.NumeroSemana = cantidadSemana.NumeroSemana;
                    semana.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                    semana.Cantidad = cantidadSemana.Cantidad;                    
                    producto.Semanas.Add(semana);
                }

                productos.Add(producto);
            }
           
            PlanProduccionCtrl1.BindTemporada = temporada.ToTemporadaComercial(); //new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };
            PlanProduccionCtrl1.ProductosDataSource = productos;
            PlanProduccionCtrl1.DataBind();
        }

        //private void GuardarDesvioParaProducto(int productoId)
        //{
        //    //PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId, GetIdsDetalle());

        //    //Desvio desvio = new Desvio();
        //    //// Asignar el estado y el Id
        //    //desvio.Id = UIHelper.GetIntFromInputText(this.txtDesvioId.Text).Value;
        //    //desvio.Estado = this.hidEstado.Value;

        //    //EstadoCharAprobado estadoDesvio = EstadoCharAprobado.Aprobado;

        //    //if (estadoDesvio == EstadoCharAprobado.EnProgreso)
        //    //{
        //    //    Desvio.TipoDesvio = (TipoDesvio)Convert.ToInt32(this.cboTipoDesvio.SelectedValue);
        //    //    Desvio.CausaDesvioId = UIHelper.GetIntFromInputCbo(this.cboDesvioCausa).Value;
        //    //    Desvio.PlanProduccionDetallePrimeraId = DetalleProdPrimeraId;
        //    //    Desvio.UsuarioCreador = BaseWebPage.UserName;

        //    //    // Capturo los valores que vinieron en los inputs y creo el desvio
        //    //    PlanProduccionDetalleProd detalleProducto = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdPrimeraId).Single();
        //    //    var cantidadesPorSemanaOrdenadas = detalleProducto.CantidadesPorSemana.OrderBy(s => s.NumeroSemana);

        //    //    bool existeSegunda = DetalleProdSegundaId.HasValue;
        //    //    PlanProduccionDetalleProd detalleProductoSegunda = null;
        //    //    if (existeSegunda)
        //    //    {
        //    //        detalleProductoSegunda = PlanProduccion.DetalleDeProductos.Where(d => d.Id == DetalleProdSegundaId.Value).Single();
        //    //    }

        //    //    int columna = 0;
        //    //    int totalOriginal = 0;
        //    //    int totalConCambios = 0;

        //    //    Desvio.DesvioDetalles.Clear();
        //    //    foreach (var cantidadSemana in cantidadesPorSemanaOrdenadas)
        //    //    {
        //    //        string inputName = PlanProdDetalleCambios.ClientID + "_planprodcant_" + columna + "_1";
        //    //        string inputNameSegunda = PlanProdDetalleCambios.ClientID + "_planprodcant_" + columna + "_2";

        //    //        columna++;

        //    //        string valorSemanaInput = this.Request.Form[inputName];
        //    //        string valorSemanaInputSegunda = string.Empty;
        //    //        if (existeSegunda)
        //    //        {
        //    //            valorSemanaInputSegunda = this.Request.Form[inputNameSegunda];
        //    //        }

        //    //        if (!String.IsNullOrEmpty(valorSemanaInput))
        //    //        {
        //    //            int valorSemanaInputInt = Convert.ToInt32(valorSemanaInput);

        //    //            totalOriginal += cantidadSemana.Cantidad;
        //    //            totalConCambios += valorSemanaInputInt;
        //    //            // Si hubo un cambio
        //    //            if (valorSemanaInputInt != cantidadSemana.Cantidad)
        //    //            {
        //    //                DesvioDetalle detalleDesvio = new DesvioDetalle();
        //    //                detalleDesvio.DetalleProductoCantidadId = cantidadSemana.Id;
        //    //                detalleDesvio.CantidadInicial = cantidadSemana.Cantidad;
        //    //                detalleDesvio.CantidadFinal = valorSemanaInputInt;
        //    //                Desvio.DesvioDetalles.Add(detalleDesvio);
        //    //            }
        //    //        }

        //    //        if (existeSegunda)
        //    //        {
        //    //            if (!String.IsNullOrEmpty(valorSemanaInputSegunda))
        //    //            {
        //    //                int valorSemanaInputIntSegunda = Convert.ToInt32(valorSemanaInputSegunda);
        //    //                PlanProduccionDetalleProdSemanal cantidadSemanaSegunda = detalleProductoSegunda.CantidadesPorSemana.Where(c => c.NumeroSemana == cantidadSemana.NumeroSemana).Single();
        //    //                totalOriginal += cantidadSemana.Cantidad;
        //    //                totalConCambios += valorSemanaInputIntSegunda;
        //    //                // Si hubo un cambio
        //    //                if (valorSemanaInputIntSegunda != cantidadSemanaSegunda.Cantidad)
        //    //                {
        //    //                    DesvioDetalle detalleDesvioSegunda = new DesvioDetalle();
        //    //                    detalleDesvioSegunda.DetalleProductoCantidadId = cantidadSemanaSegunda.Id;
        //    //                    detalleDesvioSegunda.CantidadInicial = cantidadSemanaSegunda.Cantidad;
        //    //                    detalleDesvioSegunda.CantidadFinal = valorSemanaInputIntSegunda;
        //    //                    Desvio.DesvioDetalles.Add(detalleDesvioSegunda);
        //    //                }
        //    //            }
        //    //        }
        //    //    }

        //    //    if (Desvio.TipoDesvio == TipoDesvio.Movimiento && !Desvio.EsMovimientoValido())
        //    //    {
        //    //        this.masterPage.ShowMessage("El desvío del tipo movimiento debe mantener el total inalterado", WebMessageType.Warning);
        //    //    }
        //    //    else
        //    //    {
        //    //        Desvio = WebServiceHelper.SaveDesvio(Desvio);
        //    //    }
        //    //}
        //}

        private void Guardar2()
        {
            ////name='planprodcant_desvio_" + productoId + "_" + columnaSemana + "'
            //// Obtengo el Plan, por cada producto obtengo los valores de los desvios y los cargo como tales
            //PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId);
            ////Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);
            ////TemporadaComercial temporadaComercial = new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };

            //int tipoDesvioId = Convert.ToInt32(cboTipoDesvio.SelectedValue);
            //int causaDesvioId = Convert.ToInt32(cboDesvioCausa.SelectedValue);

            //List<Desvio> desvios = new List<Desvio>();
            //bool nuevaProductoEnSegunda = false;
            //int detalleProdIdEnElPlan = 0;
            //foreach (var detalleProducto in PlanProduccion.DetalleDeProductos)
            //{
            //    nuevaProductoEnSegunda = false;
            //    detalleProdIdEnElPlan = 0;
            //    //PlanProduccionDetalleProd detalleProd = 
            //    if (!detalleProducto.DesvioPendienteDeAprobacion)
            //    {
            //        //cuando guardo segunda en realidad trabajo con el objeto de segunda
            //        // Por cada detalle, hay un desvio
            //        Desvio desvio = new Desvio();
            //        desvios.Add(desvio);
            //        desvio.Estado = Convert.ToString((char)EstadoCharAprobado.EsperandoAprobacion);

            //        desvio.IntTipoDesvio = tipoDesvioId;
            //        PlanProduccionDetalleProd detalleProductoDeSegunda = null;
            //        if (desvio.TipoDesvio == TipoDesvio.PasajeASegunda)
            //        {
            //            // Si es segunda, tengo que buscar el id de segunda tambien
            //            desvio.PlanProduccionDetallePrimeraId = detalleProducto.Id;
            //            desvio.PlanProduccionDetalleSegundaId = detalleProducto.ProductoSegundaId;

            //            if (detalleProducto.ProductoSegundaId.HasValue)
            //            {
            //                detalleProductoDeSegunda = PlanProduccion.DetalleDeProductos.Where(d => d.ProductoId == detalleProducto.ProductoSegundaId.Value).SingleOrDefault();
            //                if (detalleProductoDeSegunda == null)
            //                {
            //                    // Tengo que agregar el producto de segunda en el plan
            //                    detalleProdIdEnElPlan = WebServiceHelper.CrearDetalleDeProductoParaPlanDeProduccion(detalleProducto.ProductoSegundaId.Value, PlanProduccion.Id);
            //                    nuevaProductoEnSegunda = true;
            //                }
            //            }
            //            else
            //            {
            //                throw new Exception(string.Format("El producto de segunda no existe para el producto {0}", detalleProducto.ProductoNombre));
            //            }

            //        }
            //        else
            //        {
            //            desvio.PlanProduccionDetallePrimeraId = detalleProducto.Id;
            //        }

            //        desvio.UsuarioCreador = WebServiceHelper.ServiceOptionsDefault.UserName;
            //        desvio.CausaDesvioId = causaDesvioId;
            //        //desvio.Estado = Es

            //        bool hayDesvio = false;
            //        foreach (var cantidadSemana in detalleProducto.CantidadesPorSemana)
            //        {
            //            int numeroSemana = cantidadSemana.NumeroSemana - 1;
            //            string inputName = "planprodcant_desvio_" + detalleProducto.ProductoId.ToString() + "_" + numeroSemana.ToString();
            //            string valorSemanaInput = this.Request.Form[inputName];
            //            if (!String.IsNullOrEmpty(valorSemanaInput))
            //            {
            //                if (desvio.TipoDesvio == TipoDesvio.PasajeASegunda)
            //                {
            //                    var cantidadSemanaSegunda = detalleProductoDeSegunda.CantidadesPorSemana.Where(s => s.NumeroSemana == cantidadSemana.NumeroSemana).Single();
            //                    int valorSemanaSegundaInt = Convert.ToInt32(valorSemanaInput);
            //                    if (valorSemanaSegundaInt != 0)
            //                    {
            //                        hayDesvio = true;
            //                        // => es un desvio
            //                        DesvioDetalle desvioDetalle = new DesvioDetalle();
            //                        if (nuevaProductoEnSegunda)
            //                        {
            //                            desvioDetalle.DetalleProductoCantidadId = detalleProdIdEnElPlan;
            //                            desvioDetalle.CantidadInicial = 0;
            //                            desvioDetalle.CantidadFinal = valorSemanaSegundaInt;
            //                        }
            //                        else
            //                        {
            //                            desvioDetalle.DetalleProductoCantidadId = cantidadSemanaSegunda.Id;
            //                            desvioDetalle.CantidadInicial = cantidadSemanaSegunda.Cantidad;
            //                            desvioDetalle.CantidadFinal += valorSemanaSegundaInt; // Agrego
            //                        }

            //                        desvio.DesvioDetalles.Add(desvioDetalle);
            //                        cantidadSemanaSegunda.Cantidad = valorSemanaSegundaInt; // Ya no se usa porque pido todo de nuevo

            //                        valorSemanaInput = (cantidadSemana.Cantidad - valorSemanaSegundaInt).ToString(); // Esto es lo que queda en primera
            //                    }

            //                    // Cambio el valor para primera, que es la resta, aca el orden importa! porque trabaja fuera de este if

            //                }

            //                // Cargo el detalle en la primera que es la resta del actual y lo que pusieron en segunda
            //                int valorSemanaInputInt = Convert.ToInt32(valorSemanaInput);
            //                if (valorSemanaInputInt != cantidadSemana.Cantidad)
            //                {
            //                    hayDesvio = true;
            //                    // => es un desvio
            //                    DesvioDetalle desvioDetalle = new DesvioDetalle();
            //                    desvioDetalle.DetalleProductoCantidadId = cantidadSemana.Id;
            //                    desvioDetalle.CantidadInicial = cantidadSemana.Cantidad;
            //                    desvioDetalle.CantidadFinal = valorSemanaInputInt;
            //                    desvio.DesvioDetalles.Add(desvioDetalle);
            //                    cantidadSemana.Cantidad = valorSemanaInputInt;
            //                }
            //            }
            //        }

            //        if (!hayDesvio)
            //        {
            //            desvios.Remove(desvio);
            //        }
            //    }
            //}

            //// Tengo la lista de desvios cargada, tengo que guardarlos
            ////desvios

            //if (desvios.Count > 0)
            //{
            //    WebServiceHelper.SaveYAprobarDesvioMasivo(desvios, WebServiceHelper.ServiceOptionsDefault.UserName, EstadoCharAprobado.Aprobado);
            //}
        }

        private void Guardar()
        {
            //name='planprodcant_desvio_" + productoId + "_" + columnaSemana + "'
            // Obtengo el Plan, por cada producto obtengo los valores de los desvios y los cargo como tales
            PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId);
            //Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);
            //TemporadaComercial temporadaComercial = new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };
                       
            int tipoDesvioId = Convert.ToInt32(cboTipoDesvio.SelectedValue);
            int causaDesvioId = Convert.ToInt32(cboDesvioCausa.SelectedValue);

            // Mapeo el orden de la grilla con los numeros de semana
            Temporada temporada = WebServiceHelper.GetTemporadaById(PlanProduccion.TemporadaId);
            HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaOrden();
            
            List<DesvioUpdate> desvios = new List<DesvioUpdate>();        
            foreach (var detalleProducto in PlanProduccion.DetalleDeProductos)
            {               
                if (!detalleProducto.DesvioPendienteDeAprobacion)
                {
                    DesvioUpdate desvio = new DesvioUpdate();                    
                    desvio.ProductoId = detalleProducto.ProductoId;
                                       
                    foreach (var cantidadSemana in detalleProducto.CantidadesPorSemana)
                    {
                        // aca esta el problema
                        int ordenSemana = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                        string inputName = "planprodcant_desvio_" + detalleProducto.ProductoId.ToString() + "_" + ordenSemana.ToString();
                        string valorSemanaInput = this.Request.Form[inputName];
                        if (!String.IsNullOrEmpty(valorSemanaInput))
                        {
                            desvio.Detalles.Add(new DesvioUpdateDetalle()
                            {
                                Cantidad = Convert.ToInt32(valorSemanaInput),
                                NumeroSemana = cantidadSemana.NumeroSemana
                            });
                        }                            
                    }

                    if (desvio.Detalles.Count > 0)
                    {
                        desvios.Add(desvio);
                    }
                }
            }                     

            if (desvios.Count > 0)
            {
                WebServiceHelper.IncorporarDesvios(PlanProduccionId, tipoDesvioId, causaDesvioId, desvios);
            }
        }

        protected void lnkCargarDesvioMasivo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(string.Format("/App/DesvioMasivo.aspx?PlanProdId={0}", PlanProduccionId), true);
        }

        protected void lnkVerPendientes_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(string.Format("/App/DesvioList.aspx?PlanProdId={0}", PlanProduccionId), true);
        }

        protected void lnkGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Guardar();
                PlanProduccion = WebServiceHelper.GetPlanProduccionById(PlanProduccionId);
                Bind();
                this.masterPage.ShowMessage("Los desvios se guardaron correctamente", WebMessageType.Notification);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }      

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect("/App/PlanProduccionList.aspx", true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}